Для реализации динамической клавиатуры с пагинацией в Telegram-боте на библиотеках aiogram и gspread, необходимо выполнить следующие шаги:
1. Установить библиотеки aiogram и gspread, если они еще не установлены:
pip install aiogram gspread
2. Импортировать необходимые модули:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
import gspread
from oauth2client.service_account import ServiceAccountCredentials
3. Создать экземпляр бота и диспетчера:
bot = Bot(token="YOUR_TELEGRAM_BOT_TOKEN")
dp = Dispatcher(bot)
4. Настроить доступ к таблице Google Sheets с помощью gspread:
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('YOUR_GOOGLE_SHEETS_CREDENTIALS.json', scope)
gc = gspread.authorize(credentials)
# Открыть нужную таблицу
worksheet = gc.open('YOUR_GOOGLE_SHEETS_SPREADSHEET_NAME').sheet1
5. Создать список данных из таблицы Google Sheets:
data = worksheet.col_values(1)
6. Обработать сообщение пользователя:
@dp.message_handler(commands=['start'])
async def start_command(msg: types.Message):
# Проверяем, что у нас есть данные
if not data:
await msg.answer("Нет данных для отображения!")
return
# Отправляем сообщение пользователю с первыми 8 значениями
await send_data(msg, 0, 8)
7. Создать функцию для отправки сообщения с данными и кнопками:
async def send_data(msg: types.Message, start: int, count: int):
# Проверяем, чтобы начальный индекс был в допустимом диапазоне данных
if start < 0:
start = 0
# Проверяем, чтобы начальный индекс не превышал размер данных
if start >= len(data):
start = len(data) - 1
# Получаем нужные значения данных
values = data[start:start+count]
# Создаем клавиатуру с inline-кнопками
keyboard = InlineKeyboardMarkup(row_width=1)
# Создаем кнопки с данными
for value in values:
button = InlineKeyboardButton(value, callback_data=value)
keyboard.add(button)
# Смотрим, чтобы было больше данных для пагинации
if start+count < len(data):
next_button = InlineKeyboardButton('Вперед', callback_data='next')
keyboard.add(next_button)
# Проверяем, чтобы были данные для возврата назад
if start >= count:
prev_button = InlineKeyboardButton('Назад', callback_data='prev')
keyboard.add(prev_button)
# Отправляем сообщение с данными и клавиатурой
await msg.reply("Данные:", reply_markup=keyboard)
8. Создаем обработчик callback-запросов:
@dp.callback_query_handler(lambda c: c.data in ['next', 'prev'])
async def handle_pagination(callback_query: types.CallbackQuery):
# Получаем текущую позицию в данных из callback-запроса
current_position = data.index(callback_query.message.text.split("n")[1])
# Перемещаемся вперед или назад в зависимости от нажатой кнопки
if callback_query.data == 'next':
await send_data(callback_query.message, current_position, 8)
else:
await send_data(callback_query.message, current_position-8, 8)
# Удаляем старое сообщение с клавиатурой
await callback_query.message.delete()
9. Запустить бота:
executor.start_polling(dp)
Теперь ваш Telegram-бот будет отображать список данных из Google Sheets с использованием динамической клавиатуры с пагинацией. Пользователь сможет просматривать следующие значения, нажимая на кнопку "Вперед", и возвращаться к предыдущим значениям с помощью кнопки "Назад".